#include "thttpd.h"
#include "shmem.h"
#include "list.h"
#include "modbus.h"
#include "common.h"
#include "msg_queue_peer.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 声明全局变量
extern struct list_head head;
pthread_mutex_t mutex;

// 函数声明
int send_control_command(int key, int value);
// void start_control_shell();

// 设备控制线程
void *commandprocessing(void *arg)
{
    printf("设备控制线程启动\n");
    printf("------------------------------------------\n");

    modbus_t *ctx = (modbus_t *)arg;
    struct control_msg msg;
    int rc;

    while (1) {
        // 从消息队列接收控制命令
        rc = msg_queue_recv("device_control", &msg, sizeof(msg), 0, 0); // 接收所有类型消息
        if (rc < 0) {
            if (errno == ENOMSG) {
                usleep(100000); // 没有消息时短暂休眠
                continue;
            }
            perror("消息队列接收失败");
            sleep(1);
            continue;
        }

        printf("收到控制命令: mtype=%ld, key=%d\n", msg.mtype, msg.key);

        // 检查消息类型是否符合预期
        if (msg.mtype != MSG_TYPE_CONTROL && msg.mtype != MSG_TYPE_CONTROL_2) {
            printf("忽略未知消息类型: %ld\n", msg.mtype);
            continue;
        }

        // 查找要控制的设备
        struct list_head *pos;
        int found = 0;
        struct mb_node_list *mb_node;

        pthread_mutex_lock(&mutex);
        list_for_each(pos, &head) {
            mb_node = list_entry(pos, struct mb_node_list, list);
            if (mb_node->node.key == msg.key) {
                found = 1;
                break;
            }
        }

        if (!found) {
            pthread_mutex_unlock(&mutex);
            fprintf(stderr, "未找到key=%d的设备\n", msg.key);
            continue;
        }

        // 根据设备类型执行控制
        switch (mb_node->node.type) {
        case 1: { // 线圈状态 (开关量)
            rc = modbus_write_bit(ctx, mb_node->node.addr, msg.value.b_val);
            if (rc == 1) {
                printf("控制成功: %s(addr=%d) 设置为 %d\n",
                       mb_node->node.name, mb_node->node.addr, msg.value.b_val);
            } else {
                fprintf(stderr, "控制失败: %s\n", modbus_strerror(errno));
            }
            break;
        }
        case 2: { // 保持寄存器 (模拟量)
            int reg_addr = mb_node->node.addr - 40001;
            rc = modbus_write_register(ctx, reg_addr, msg.value.i_val);
            if (rc == 1) {
                printf("控制成功: %s(addr=%d) 设置为 %d\n",
                       mb_node->node.name, mb_node->node.addr, msg.value.i_val);
            } else {
                fprintf(stderr, "控制失败: %s\n", modbus_strerror(errno));
            }
            break;
        }
        default:
            fprintf(stderr, "不支持的设备类型: %d\n", mb_node->node.type);
            break;
        }
        pthread_mutex_unlock(&mutex);
    }
    return NULL;
}
// 发送控制命令的接口函数
int send_control_command(int key, int value)
{
    struct control_msg msg;
    msg.mtype = MSG_TYPE_CONTROL;
    msg.key = key;
    msg.value.i_val = value;

    return msg_queue_send("device_control", &msg, sizeof(msg), 0);
}

// // 控制终端界面
// void start_control_shell()
// {
//     printf("\nModbus 设备控制终端\n");
//     printf("------------------------------------------\n");
//     printf("可用设备:\n");
//     printf("  101 - air-temp (设置温度)\n");
//     printf("  102 - air-switch (空气开关: 0=关, 1=开)\n");
//     printf("  103 - mo-switch (模式开关)\n");
//     printf("  104 - spray-switch (喷雾开关)\n");
//     printf("  105 - Disinfection-switch (消毒开关)\n");
//     printf("------------------------------------------\n");
//     printf("格式: <key> <value> (如: 102 1 或 101 25)\n");
//     printf("输入 'exit' 退出\n\n");

//     char input[50];
//     while (1)
//     {
//         printf("control> ");
//         fflush(stdout);

//         if (fgets(input, sizeof(input), stdin) == NULL)
//         {
//             break; // 处理EOF (Ctrl+D)
//         }

//         // 去除换行符
//         input[strcspn(input, "\n")] = 0;

//         if (strcmp(input, "exit") == 0)
//         {
//             break;
//         }

//         int key, value;
//         if (sscanf(input, "%d %d", &key, &value) == 2)
//         {
//             if (send_control_command(key, value) == 0)
//             {
//                 printf("[成功] 命令已发送: key=%d, value=%d\n", key, value);
//             }
//             else
//             {
//                 printf("[失败] 发送命令失败!\n");
//             }
//         }
//         else
//         {
//             printf("无效输入! 请使用格式: <key> <value>\n");
//             printf("示例: 102 1 (打开空气开关)\n");
//         }
//     }
//     printf("退出控制终端\n");
// }